package com.tianhao.rabbitmq.producer;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;

/**
 * @ClassName: RabbitProducer
 * @Description: 消费者
 * @author: tianhao.luo@hand-china.com
 * @date: 2020/11/10  21:18
 */
public class RabbitProducer {
    private static final String EXCHANGE_NAME = "exchange_demo";
    private static final String ROUTING_KEY = "routingkey_demo";
    private static final String QUEUE_NAME = "queue_demo";
    private static final String IP_ADDRESS = "192.168.15.78";
    /**
     * rabbitmq默认端口号为5672
     */
    private static final int PORT = 5672;

    public static void main(String[] args) throws Exception{
        /*
         * 便利的工厂类，以方便打开到RabbitMQ节点的Connection。
         * 大多数连接和socket设置都是使用此工厂配置的。
         * 也可以在此处配置一些适用于连接的设置*，这些设置将适用于该工厂生产的所有连接。
         */
        ConnectionFactory factory = new ConnectionFactory();
        /*
         * 用于连接的默认主机
         */
        factory.setHost(IP_ADDRESS);
        /*
         * 用于连接的默认端口
         */
        factory.setPort(PORT);
        /*
         * 连接到代理时要使用的AMQP用户名
         */
        factory.setUsername("root");
        /*
         * 连接到代理时使用的密码
         */
        factory.setPassword("root");
        /*
         * 创建一个代理连接
         */
        Connection connection = factory.newConnection();
        /*
         * 使用内部分配的通道号创建一个新通道。
         */
        Channel channel = connection.createChannel();
        /*
         * 创建一个type="direct"、持久化、非自动删除的交换器
         */
        channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,null);
        /*
         * 将交换器与队列通过路由键绑定
         */
        channel.queueDeclare(QUEUE_NAME,true,false,false,null);

        /*
         * 将交换器与队列通过路由键绑定
         */
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY);
        /*
         * 待发送的消息
          */
        String message="hello world";
        /*
         * 发布消息
         * 发布到不存在的交换将导致通道级协议异常，从而关闭通道
         * MessageProperties.PERSISTENT_TEXT_PLAIN：消息的其他属性-路由标头等
         * message.getBytes()：消息正文
         */
        channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN,
                message.getBytes());
        /*
          关闭资源
         */
        channel.close();
        connection.close();
    }

}
